package com.haoze.nurseapp.dao;

import com.haoze.common.mapper.MyMapper;
import com.haoze.common.model.OrdersFileIndexDataEntity;
import com.haoze.common.model.TaskExecuteBatchEntity;
import com.haoze.nurseapp.dto.NodeInfoDTO;
import com.haoze.nurseapp.dto.task.TaskExecuteDetailDTO;
import com.haoze.nurseapp.model.*;
import com.haoze.nurseapp.vo.OrderInfo;
import com.haoze.repository.model.EmrCatalogEntity;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.bind.annotation.PostMapping;

import java.util.Date;
import java.util.List;
import java.util.Map;

public interface TaskExecuteMapper extends MyMapper<TaskExecuteEntity> {

    /**
     * 根据任务节点查询当前节点是否存在本病区未处理收药记录
     *
     * @param taskNodeId
     * @param userId
     * @return
     */
    Integer queryIsExists(@Param("taskNodeId") String taskNodeId, @Param("userId") String userId);

    String queryIdBytaskNodeId(@Param("taskNodeId") String taskNodeId);

    /**
     * 根据当前获取的前一节点ID和当前登录人ID查询本病区文书ID集合
     *
     * @param taskNodeIdBefore
     * @param userId
     * @return
     */
    List<String> queryEmrFileIdByPreId(@Param("taskNodeIdBefore") String taskNodeIdBefore, @Param("userId") String userId);

    List<Map<String, String>> queryDrugInfoByFileId(@Param("fileId") String fileId);

    /**
     * 根据任务节点ID，当前药品名称和当前登录人ID获取本病区当前节点对应的医嘱信息
     *
     * @param drugName
     * @param taskNodeId
     * @param userId
     * @return
     */
    List<PatientOrdersEntity> queryOrders(@Param("drugName") String drugName, @Param("taskNodeId") String taskNodeId, @Param("userId") String userId);

    /**
     * 根据任务节点ID和当前登录人ID获取已收药品列表信息
     * @param taskNodeId
     * @param userId
     * @return
     */
    //List<Map<String, String>> queryTreatedDrugList(@Param("taskNodeId") String taskNodeId, @Param("userId") String userId);

    /**
     * 根据条形码查询对应医嘱的药品信息展示摆药列表
     *
     * @param qrCode
     * @return
     */
    List<Map<String, String>> queryOrdersInfoByQrcode(@Param("qrCode") String qrCode);

    List<Map<String, String>> selectOrderForGenerate(@Param("qrCode") String qrCode);

    List<Map<String, String>> selectOrderByQrcode(@Param("inpatNum") String inpatNum, @Param("freqTime") Date freqTime, @Param("timeStr") String timeStr);

    List<Map<String, String>> queryDrugsByQrCode(@Param("qrCode") String qrCode);

    /**
     * 根据传递过来的任务节点ID获取下一任务节点ID（任务流程配死，去task_node_condition查任务节点id条件为当前任务节点id=condition中的前一节点ID）
     *
     * @param taskNodeId
     * @return
     */
    String queryNextTaskNodeId(@Param("taskNodeId") String taskNodeId);

    /**
     * 根据传递过来的任务节点ID获取前一节点任务ID（任务流程配死，去task_node_condition查任务节点id条件为当前任务节点id=condition中的节点ID）
     *
     * @param taskNodeId
     * @return
     */
    String queryPreTaskNodeId(@Param("taskNodeId") String taskNodeId);

    /**
     * 根据医嘱ID获取任务ID
     *
     * @param inpatOrderDataId
     * @return
     */
    String queryTaskId(@Param("inpatOrderDataId") String inpatOrderDataId);

    /**
     * 根据医嘱编号获取当前医嘱对应的病人入院号
     *
     * @param inpatOrderDataId
     * @return
     */
    PatientOrdersEntity queryInpatNum(@Param("inpatOrderDataId") String inpatOrderDataId);

    /**
     * 根据当前任务节点ID获取前一任务节点
     *
     * @param taskNodeId
     * @return
     */
    TaskExecuteDetailEntity queryPreTaskNode(@Param("taskNodeId") String taskNodeId);

    /**
     * 根据当前节点名称获取有效的模板ID
     *
     * @param nodeId
     * @return
     */
    String queryTplId(@Param("nodeId") String nodeId);

    /**
     * 根据模板ID查询病历目录ID
     *
     * @param tplId
     * @return
     */
    String queryCtlId(@Param("tplId") String tplId);

    /**
     * 获取工作台目录对应任务节点ID
     *
     * @return
     */
    List<Map<String, String>> getWorkbenchInfo();

    /**
     * 根据节点ID获取当前节点名称，用来判定当前流程进行到的步骤
     *
     * @param nodeId
     * @return
     */
    String queryNodeNameByNodeId(String nodeId);

    /**
     * 根据日期和任务ID查询当前日期当前任务的总量，未执行量及执行量
     *
     * @param nodeId
     * @param queryDate
     * @param userId
     * @return
     */
    Map<String, String> queryTaskNum(@Param("nodeId") String nodeId, @Param("queryDate") String queryDate, @Param("userId") String userId, @Param("wardId") String wardId);

    /**
     * 根据当前任务节点的节点ID获取当前所有已执行未执行的任务数据
     *
     * @param nodeId
     * @param queryDate
     * @param search
     * @param userId
     * @return
     */
    List<Map<String, String>> queryAllTaskInfo(@Param("nodeId") String nodeId, @Param("queryDate") String queryDate, @Param("search") String search, @Param("userId") String userId, @Param("wardId") String wardId);

    /**
     * 根据当前任务节点的节点ID获取当前所有已执行的任务数据
     *
     * @param nodeId
     * @param queryDate
     * @param search
     * @param userId
     * @param wardId
     * @return
     */
    List<Map<String, String>> queryPerformedTaskInfo(@Param("nodeId") String nodeId, @Param("queryDate") String queryDate, @Param("search") String search, @Param("userId") String userId, @Param("wardId") String wardId);

    /**
     * 根据当前任务节点的节点ID获取当前所有未执行的任务数据
     *
     * @param nodeId
     * @param queryDate
     * @param search
     * @param userId
     * @param wardId
     * @return
     */
    List<Map<String, String>> queryFailedTaskInfo(@Param("nodeId") String nodeId, @Param("queryDate") String queryDate, @Param("search") String search, @Param("userId") String userId, @Param("wardId") String wardId);

    /**
     * 根据当前任务节点的节点ID获取退药的任务数据
     *
     * @param nodeId
     * @param queryDate
     * @param search
     * @param userId
     * @param wardId
     * @return
     */
    List<Map<String, String>> queryReturnTasks(@Param("nodeId") String nodeId, @Param("queryDate") String queryDate, @Param("search") String search, @Param("userId") String userId, @Param("wardId") String wardId);

    /**
     * 根据当前列表中的医嘱编号获取对应的任务节点流程中对应的数据
     *
     * @param inpatOrderDataId
     * @return
     */
    List<TaskExecuteDetailEntity> queryDetailByInpatOrderDataId(String inpatOrderDataId, String taskNodeId);

    /**
     * 根据流程节点明细ID获取当前任务节点对应文书
     *
     * @param taskExecuteDetailId
     * @return
     */
    OrdersFileIndexDataEntity queryFileIndexData(String taskBatchId);

    /**
     * 查看当前医嘱是否在当前节点有数据
     *
     * @param inpatOrderDataId
     * @param taskNodeId
     * @return
     */
    Integer queryCurrTaskNodeOrder(String inpatOrderDataId, String taskNodeId);

//    List<String> queryExecuteTaskNode(@Param("inpatOrderIds") List<String> inpatOrderIds, @Param("taskNodeId") String taskNodeId);

    Map<String, String> queryQrInpatNum(@Param("qrCode") String qrCode, @Param("nodeId") String nodeId);

    Map<String, String> queryQrInpatNumNoNode(@Param("qrCode") String qrCode);

    Map<String, String> queryExecuteDetail(@Param("qrCode") String qrCode);

    List<String> queryInpatOrderIds(@Param("inpatNum") String inpatNum, @Param("inpatOrderId") String inpatOrderId);

    List<Map<String, String>> queryOrderDrugs(@Param("inpatOrderIds") List<String> inpatOrderIds, @Param("inpatNum") String inpatNum);

    /**
     * 根据医嘱获取医嘱对应的qrCode
     */
    String queryOrderQrcode(@Param("inpatOrderId") String inpatOrderId);

    /**
     * 根据医嘱编号和任务流节点编号获取该医嘱该节点未设置qrcode的记录
     */
    List<String> queryNoBatchQrcode(@Param("inpatOrderId") String inpatOrderId,
                                    @Param("taskNodeId") String taskNodeId,
                                    @Param("taskId") String taskId);

    /**
     * 根据医嘱编号和任务流节点编号获取该医嘱该节点已设置qrcode的最大值
     */
    String queryOwnBatchQrcodeSum(@Param("inpatOrderId") String inpatOrderId,
                                  @Param("taskNodeId") String taskNodeId,
                                  @Param("taskId") String taskId);


    Integer updateQrcodeByDetailId(@Param("qrCode") String qrCode,
                                   @Param("executeDetailId") String executeDetailId,
                                   @Param("barcode") String barcode);

    /**
     * 获取系统中最大的barcode
     */
    String queryLargestBarcode();

    /**
     * 根据住院号和组医嘱编号获取patient_order中组医嘱第一条子医嘱编号
     */
    String queryInpatOrderId(@Param("inpatNum") String inpatNum, @Param("orderNo") String orderNo);

    /**
     * 根据barCode获取当前任务流程的文书信息
     *
     * @param barCode
     * @return
     */
    List<OrdersFileIndexDataEntity> queryInfoByBarCode(String barCode);

    String queryTaskNodeId(String qrCode);

    String queryEmrFileId(@Param("qrCode") String qrCode);

    /**
     * 根据qrCode和nodeId获取当前任务节点taskNodeId
     *
     * @param qrCode
     * @param nodeId
     * @return
     */
    String queryTaskNodeIdByNodeId(String qrCode, String nodeId);

    /**
     * 根据his系统表中的入院号及医嘱组号查询医嘱信息
     *
     * @param inpatNum
     * @param orderNo
     * @param nodeId
     */
    Integer queryOneInpatOrder(@Param("inpatNum") String inpatNum, @Param("orderNo") String orderNo, @Param("nodeId") String nodeId);

    /**
     * 根据医嘱ID获取当前医嘱对应任务ID
     *
     * @param inpatOrderId
     * @return
     */
    String queryTaskIdByOrderNum(String inpatOrderId);

    /**
     * 根据医嘱ID获取当前医嘱对应的任务节点ID
     *
     * @param inpatOrderId
     * @return
     */
    String queryTaskNodeIdByOrderNum(String inpatOrderId);

    /**
     * 根据qrCode获取流程节点明细信息(该接口已废弃，请使用queryTaskExecuteInfo这个接口)
     *
     * @param qrCode
     * @param nodeId
     * @return
     */
    @Deprecated
    TaskExecuteDetailEntity queryTaskExecute(@Param("qrCode") String qrCode, @Param("nodeId") String nodeId);

    /**
     * 根据qrCode获取流程节点明细信息,包括batchnumber
     *
     * @param qrCode
     * @param nodeId
     * @return
     */
    TaskExecuteDetailDTO queryTaskExecuteInfo(@Param("qrCode") String qrCode, @Param("nodeId") String nodeId);


    /**
     * 验证权限
     *
     * @return
     */
    String identifyAuthority(@Param("userId") String userId, @Param("inpatNum") String inpatNum);

    /**
     * 查询住院号和组医嘱编号
     *
     * @param qrCode
     * @return
     */
    Map<String, String> queryInpatNumAndOrderNo(@Param("qrCode") String qrCode);

    /**
     * 条码匹配
     *
     * @param firstQrCode
     * @param secondQrCode
     * @param nodeEnter
     * @return
     */
    String identifyQrCodeMatch(@Param("firstQrCode") String firstQrCode,
                               @Param("secondQrCode") String secondQrCode,
                               @Param("nodeEnter") String nodeEnter);

    /**
     * 条码匹配
     *
     * @param firstQrCode
     * @param secondQrCode
     * @param nodeId
     * @return
     */
    String identifyQrCodeMatch2(@Param("firstQrCode") String firstQrCode,
                                @Param("secondQrCode") String secondQrCode,
                                @Param("nodeId") String nodeId);


    Map<String, String> queryQrInpatNumByNode(@Param("qrCode") String qrCode, @Param("nodeId") String nodeId);

    List<Map<String, String>> queryCycleOrderExec(@Param("nowDateStr") String nowDateStr);

    Map<String, String> getEmrFileIdFromExec(@Param("inpatorderdataId") String inpatorderdataId);

    int updateOrderExecuteTime(@Param("inpatorderdataId") String inpatorderdataId, @Param("nextExecDate") Date nextExecDate);

    int save(TaskExecuteEntity taskExecuteEntity);

    Map<String, String> getInjectTaskIdAndNodeId(@Param("inpatOrderId") String inpatOrderId);

    /**
     * 获取当天未匹配静配中心的数据
     *
     * @param currentDate
     * @return
     */
    List<TaskExecuteBatchEntity> queryTaskInfo(@Param("currentDate") String currentDate, @Param("taskCode") String taskCode);

    /**
     * 根据医嘱ID获取当前医嘱组ID
     *
     * @param inpatorderdataId
     * @return
     */
    String queryorderNo(String inpatorderdataId);

    /**
     * 验证医嘱状态
     *
     * @param firstQrCode
     * @param secondQrCode
     * @return
     */
    Map<String, String> identifyOrderStatus(@Param("firstQrCode") String firstQrCode,
                                            @Param("secondQrCode") String secondQrCode);

    /**
     * 查询医嘱状态和病人信息
     *
     * @param firstQrCode
     * @return
     */
    Map<String, String> identifyOrderStatusAndInpat(@Param("firstQrCode") String firstQrCode);

    Map<String, String> queryExecuteNode(@Param("qrCode") String qrCode);

    List<OrderInfo> queryOrderInfos(@Param("inpatOrderId") String inpatOrderId, @Param("inpatNum") String inpatNum);

    /**
     * 功能和queryOrderInfos一样，不过是根据标本条码获取
     *
     * @param specimen
     * @param inpatNum
     * @return
     */
    List<OrderInfo> querySepcimenOrderInfos(@Param("specimenNum") String specimen, @Param("inpatNum") String inpatNum);


    NodeInfoDTO queryWaitExecuteNode(@Param("qrCode") String qrCode);

    /**
     * 临时mapper，为演示服务，将qrCode更新到barCode
     *
     * @param taskExecuteId
     */
    int updateBarCodeByQrCode(@Param("taskExecuteId") String taskExecuteId);

    /**
     * 根据当前任务节点的节点ID获取当前所有已执行未执行的任务记录
     *
     * @param nodeId
     * @param queryDate
     * @param userId
     * @return 停用
     */
    List<TaskExecuteEntity> queryAllTask(@Param("nodeId") String nodeId, @Param("queryDate") String queryDate, @Param("userId") String userId);

    /**
     * 根据qrCode获取住院号
     *
     * @param qrCode
     * @return
     */
    String queryInpatNumByQrcode(@Param("qrCode") String qrCode);

    /**
     * 根据住院号和任务类型获取任务列表
     *
     * @param inpatNum
     * @param nodeEnter
     * @param word
     * @return
     */
    List<Map<String, String>> queryTasksWithInpatNumAndNodeEnter(@Param("inpatNum") String inpatNum, @Param("nodeEnter") String nodeEnter, @Param("word") String word);

    /**
     * 根据住院号和任务类型获取任务列表
     *
     * @param bedCard
     * @param nodeEnter
     * @return
     */
    List<Map<String, String>> queryTasksWithBedcardAndNodeEnter(@Param("bedCard") String bedCard, @Param("nodeEnter") String nodeEnter);

    /**
     * 查询床头牌
     *
     * @param qrCode
     * @return
     */
    String queryBedcardByQrcode(@Param("qrCode") String qrCode);

    /**
     * 根据文书id获取模板id
     *
     * @param emrFileId
     * @return
     */
    String queryTplByEmrFileId(@Param("emrFileId") String emrFileId);

    /**
     * 根据文书和varCode获取节点数据
     *
     * @param emrFileId
     * @param varCode
     * @return
     */
    Map<String, String> queryFileIndexDataMap(@Param("emrFileId") String emrFileId, @Param("varCode") String varCode);

    /**
     * 获取任务流明细节点执行日志
     *
     * @param inpatNum 住院号
     * @param dateTime 任务日期
     * @param search   搜索节点名称
     * @return
     */
    List<Map<String, String>> queryExecuteDetailWorkLog(@Param("inpatNum") String inpatNum,
                                                        @Param("dateTime") String dateTime,
                                                        @Param("search") String search,
                                                        @Param("type") String type);

    /**
     * 获取工作日志类型数量
     *
     * @param inpatNum
     * @param dateTime
     * @return
     */
    List<Map<String, String>> queryExecuteDetailWorkLogCount(@Param("inpatNum") String inpatNum, @Param("dateTime") String dateTime);

    List<EmrCatalogEntity> queryChildCataLogByTplId(@Param("tplId") String tplId);

    EmrCatalogEntity queryParentCataLogByTplId(@Param("tplId") String tplId);

    String queryTplIdByCtlId(@Param("ctlId") String ctlId);

    String getUserIdByTaskExecuteId(@Param("inpatOrderDataId") String inpatorderdataId);

    String getEmrFileIdByQrCode(@Param("qrCode") String qrCode);

    /* 医生 */

    Map<String, String> queryCycleOrderInfo(@Param("inpatorderdataId") String inpatorderdataId);

    Map<String, String> getMoveInjectTaskIdAndNodeId(@Param("inpatOrderId") String inpatOrderId);

    Integer selectSerialByTaskExecuteId(@Param("taskExecuteId") String taskExecuteId);

    List<Map<String, Object>> selectSpecimenWorkLog(@Param("type") String type, @Param("inpatNum") String inpatNum, @Param("dateTime") String dateTime);

    List<Map<String, Object>> selectSpecimenAndInspectWorkLog1(@Param("type") String type, @Param("inpatNum") String inpatNum, @Param("dateTime") String dateTime, @Param("orderTypeList") List<String> orderTypeList);

    List<Map<String, Object>> selectSpecimenAndInspectWorkLog2(@Param("type") String type, @Param("inpatNum") String inpatNum, @Param("dateTime") String dateTime, @Param("orderTypeList") List<String> orderTypeList);

    /**
     * 获取当日有执行任务的医嘱
     *
     * @param inpatNum
     * @param beginTime
     * @param endTime
     * @param administration
     * @return
     */
    List<Map<String, Object>> orderQRCodeNew(@Param("inpatNum") String inpatNum,
                                             @Param("beginTime") String beginTime,
                                             @Param("endTime") String endTime,
                                             @Param("administration") String administration,
                                             @Param("type") String type,
                                             @Param("staticWardList") List<String> staticWardList);


    List<Map<String, Object>> orderQRCodeNews(@Param("inpatNum") String inpatNum,
                                              @Param("beginTime") String beginTime,
                                              @Param("endTime") String endTime,
                                              @Param("administration") List<String> administration);

    List<String> queryStaticAllocationWard(@Param("taskName") String taskName);

    /**
     * 获取条码类型
     *
     * @param id
     * @return
     */
    String getAdministrationName(String id);

    List<Map<String, Object>> queryOrdersByInpatNum(@Param("inpatNum") String inpatNum, @Param("orderNo") String orderNo);

    String querySpecialUsage(@Param("administrationId") String administrationId);

    /**
     * 根据条码查询任务节点
     */
    List<Map<String, Object>> queryTaskExecuteBatchByQrCode(@Param("qrCode") String qrCode, @Param("status") String status);

    List<Map<String, Object>> queryTaskExecuteBatchByInpatorderdataId(@Param("inpatorderdataId") String inpatorderdataId, @Param("status") String status);


    String getTaskNameByQrCode(@Param("qrCode") String qrCode);

    String queryOralOrdersRelationByQrCodeAndInpatorderdataId(@Param("qrCode") String qrCode, @Param("inpatorderdataId") String inpatorderdataId);

    String queryOrderInfoFreq(@Param("inpatorderdataId") String inpatorderdataId);

    List<Map<String, String>> queryRemindInfo();

    Integer updateRemindInfo(@Param("remindingId") String remindingId);

    String queryCurrentNodeName(@Param("qrCode") String qrCode);

    Map<String, String> queryBackInfo(@Param("qrCode") String qrCode, @Param("type") String type);

    List<AtomizeMedReturnEntity> queryAtomizeMedReturnByQrCode(@Param("qrCode") String qrCode);

    int updateAtomizationTerminationStatus(@Param("dataValue") String dataValue,@Param("dataCode") String dataCode,@Param("emrFileId") String emrFileId,@Param("elementId") String elementId);

    String getDataCodeByElementId(@Param("elementId") String elementId,@Param("dataValueRemark") String dataValueRemark);

    int updateTaskExecuteBatchById(@Param("userId") String userId,@Param("status") String status,@Param("taskBatchId") String taskBatchId,@Param("stopFlag") String stopFlag);

    String queryOralOrdersRelationByQrCode(@Param("qrCode") String qrCode,@Param("inpatorderdataId") String inpatorderdataId);

    String getVarValueByVarCode(@Param("varCode") String varCode);

    /**
     * 删除穿刺点
     */
    List<PuncureChannleEntity> puncureChannleList(@Param("inpatNum") String inpatNum,@Param("pointValue") String pointValue);

    int deletePuncureChannle(@Param("inpatNum") String inpatNum,@Param("pointValue") String pointValue);
}
